package cn.tannn.surenessdemo.user.service;

import cn.tannn.surenessdemo.controller.dto.LoginDTO;
import cn.tannn.surenessdemo.controller.dto.RegisterDTO;
import cn.tannn.surenessdemo.controller.vo.AuthUserVO;
import cn.tannn.surenessdemo.user.entity.AuthUser;
import cn.tannn.surenessdemo.sureness.processor.RedisAccount;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author tan
 * @date 2022-07-18 11:18:26
 */
public interface AccountService {
    /**
     * 验证帐号、用户名和密码的有效性
     * 返回token
     * @param login 登录
     * @return token
     */
    String authenticateAccount(LoginDTO login);

    /**
     * 获取此用户名帐户所拥有的所有角色，将它们组合成字符串列表
     * @param username account username
     * @return role-string eg role1,role3,role2
     */
    List<String> loadAccountRoles(String username);

    /**
     * 注册用户
     * @param register account info}
     * @param request  request
     * @return success-true failed-false
     */
    boolean registerAccount(RegisterDTO register, HttpServletRequest request);

    /**
     * 确定帐号是否已经存在
     * @param username account info
     * @return exist-true no-false
     */
    boolean isAccountExist(String username);

    /**
     * 加载用状态信息和权限信息（会给redis存一份
     * 按用户名加载帐号信息(查redis并存redis
     * (ps: 用于 header: username,password 方式登录时的校验)
     * @param username account username
     * @return account
     */
    RedisAccount loadAccountStatus(String username);



    /**
     * 加载用状态信息和权限信息（会给redis存一份
     * 按用户名加载帐号信息（不会查redis，但会存redis
     * @param username account username
     * @return account
     */
    RedisAccount loadAccountNoRedis(String username);

    /**
     * 用户根据用户名和roleId设置角色
     * @param username username
     * @param roleCode roleCode
     * @return success-true failed-false
     */
    boolean authorityUserRole(String username, String roleCode);

    /**
     * 删除权限通过username和roleCode删除用户角色
     * @param username username
     * @param roleCode roleCode
     * @return success-true failed-false
     */
    boolean deleteAuthorityUserRole(String username, String roleCode);

    /**
     * 查询所有用户
     * @return List
     */
    List<AuthUser> findAll();

    /**
     * 设置用户状态
     * @param username 用户唯一编码
     * @param status 用户状态(1.正常 2.锁定 3.删除 4.非法)
     */
    void settingStatus(String username,Integer status);

    /**
     * 获取用户
     * @param username 用户唯一编码
     * @return AuthUser
     */
    AuthUserVO getUser(String username);


    /**
     * 初始化 超级管理员用户
     * @param password password
     */
    void initUserAdmin(String password);

    /**
     * 退出登录
     * @param request request
     */
    void logout(HttpServletRequest request);
}
